package com.qf.util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ContentExtractor {
    // 可配置的匹配规则列表（后续可扩展）
    private static final List<Pattern> CONTACT_PATTERNS = new ArrayList<>();
    private static final List<Pattern> PHONE_PATTERNS = new ArrayList<>();
    private static final List<Pattern> PRICE_PATTERNS = new ArrayList<>();

    static {
        // 联系人匹配规则（保持不变）
        CONTACT_PATTERNS.add(Pattern.compile("联[\\s]*系[\\s]*人[：:]([^<]{2,10})<"));
        CONTACT_PATTERNS.add(Pattern.compile("联系人[：:]([^<]{2,10})<"));
        CONTACT_PATTERNS.add(Pattern.compile("联系姓名[：:]([^<]{2,10})<"));

        // 电话匹配规则（关键修复）
        // 1. 使用非捕获组 (?:) 避免捕获标签文本
        // 2. 添加 \s* 处理可能的空格
        // 3. 确保捕获电话号码本身
        PHONE_PATTERNS.add(Pattern.compile("(?:联系方式|电话|手机)[：:]\\s*(1[3-9]\\d{9})"));
        PHONE_PATTERNS.add(Pattern.compile("(?:联系方式|电话|手机)[：:]\\s*(\\d{3,4}-\\d{7,8})"));

        // 4. 添加更精确的手机号匹配（避免匹配其他数字）
        PHONE_PATTERNS.add(Pattern.compile("(?<!\\d)(1[3-9]\\d{9})(?!\\d)"));

        // 5. 添加带括号的电话格式
        PHONE_PATTERNS.add(Pattern.compile("电话[：:]\\(?(0\\d{2,3})\\)?[-]?\\d{7,8}"));

        // 6. 添加 HTML 标签内的电话匹配
        PHONE_PATTERNS.add(Pattern.compile("<[^>]+>\\s*(1[3-9]\\d{9})\\s*<"));

        // 价格匹配规则（保持不变）
        PRICE_PATTERNS.add(Pattern.compile("售[价|款][：:](\\d+(\\.\\d{1,2})?)"));
        PRICE_PATTERNS.add(Pattern.compile("价[格|款][：:](\\d+(\\.\\d{1,2})?)"));
        PRICE_PATTERNS.add(Pattern.compile("￥(\\d+(\\.\\d{1,2})?)"));
    }

    public static String extractContact(String html) {
        return extract(html, CONTACT_PATTERNS);
    }

    public static String extractPhone(String html) {
        if (html == null || html.isEmpty()) return null;

        // 特殊处理：优先尝试更精确的匹配
        for (Pattern pattern : PHONE_PATTERNS) {
            Matcher matcher = pattern.matcher(html);
            if (matcher.find()) {
                // 返回最后一个非空捕获组（通常是电话号码）
                for (int i = matcher.groupCount(); i >= 1; i--) {
                    if (matcher.group(i) != null) {
                        return matcher.group(i).trim();
                    }
                }
            }
        }
        return null;
    }

    public static String extractPrice(String html) {
        return extract(html, PRICE_PATTERNS);
    }

    private static String extract(String html, List<Pattern> patterns) {
        if (html == null || html.isEmpty()) return null;

        for (Pattern pattern : patterns) {
            Matcher matcher = pattern.matcher(html);
            if (matcher.find()) {
                // 返回第一个捕获组（实际内容）
                return matcher.group(1).trim();
            }
        }
        return null;
    }

    /**
     * 验证是否为有效的电话号码
     */
    public static boolean isValidPhone(String phone) {
        if (phone == null || phone.isEmpty()) return false;

        // 手机号正则（11位，1开头）
        String mobileRegex = "^1[3-9]\\d{9}$";
        // 固定电话正则（带区号）
        String landlineRegex = "^\\d{3,4}-\\d{7,8}$";

        return phone.matches(mobileRegex) || phone.matches(landlineRegex);
    }
    // ContentExtractor.java 新增方法
    public static String extractMultiplePrices(String html) {
        if (html == null || html.isEmpty()) return null;

        // 匹配成交结果表格中的成交总价
        Pattern tablePattern = Pattern.compile(
                "<table[^>]*>.*?成交总价.*?</table>",
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL
        );

        Matcher tableMatcher = tablePattern.matcher(html);
        if (!tableMatcher.find()) {
            // 没有找到成交结果表格，使用原价提取方式
            return extractPrice(html);
        }

        String tableHtml = tableMatcher.group();
        BigDecimal totalPrice = BigDecimal.ZERO;
        boolean found = false;

        // 匹配表格中的所有价格数字
        Pattern pricePattern = Pattern.compile(
                "成交总价[^\\d>]*([\\d,]+(?:\\.[\\d]{1,2})?)",
                Pattern.CASE_INSENSITIVE
        );

        Matcher priceMatcher = pricePattern.matcher(tableHtml);
        while (priceMatcher.find()) {
            found = true;
            String priceStr = priceMatcher.group(1).replace(",", "");
            totalPrice = totalPrice.add(new BigDecimal(priceStr));
        }

        return found ? totalPrice.toString() : extractPrice(html);
    }

}